home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 21
/
Cream of the Crop 21 (Terry Blount) (October 1996).iso
/
os2
/
freetype.zip
/
raster.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-09-07
|
44KB
|
1,812 lines
{***************************************************************************}
{* *}
{* The Portable TrueType Engine - Copyright 1996 David TURNER *}
{*_________________________________________________________________________*}
{* *}
{* Unit RASTER.PAS *}
{* *}
{* This unit is in charge of the final scanlin conversion to a bitmap *}
{* *}
{* XXX : Cette version est sécurisée et fournit un sub-banding efficace *}
{* *}
{* Reste à retirer la limite de 64(up)+64(down) profils simultanés *}
{* ( Astuce : Calculer la taille des tables de tracé en fin de *}
{* parcours.. ) *}
{* *}
{***************************************************************************}
Unit RASTER;
interface
{$DEFINE DEBUG} (* Affiche par writeln les erreurs fatales du raster *)
{ $DEFINE DEBUG2} (* Trace le bloc inverse en fin de render *)
{ $DEFINE DEBUG3} (* Trace les pixels pendant le render *)
{ $DEFINE DEBUG4} (* Trace les profils plutôt que les pleins *)
{$DEFINE REVERSE} (* Autorise l'affichage des glyphes dont l'orientation *)
(* est erronnée *)
{ $DEFINE CALCUL}
uses TTTypes,
TTCalc,
TTDisp; (* This one only for debugging purpose *)
const
TTFlowDown = -1; (* Indique un bitmap orienté de haut en bas *)
TTFlowUp = 1; (* Indique un bitmap orienté de bas en haut *)
TTFlowError = 0; (* Indique une erreur lors du calcul *)
Err_Ras_None = 0;
Err_Ras_NotIni = -2; { Rasterizer not Initialized }
Err_Ras_Overflow = -3; { Profile Table Overflow }
Err_Ras_Neg_H = -4; { Negativ Height encountered ! }
Err_Ras_Invalid = -5; { Invalid value encountered ! }
TTDropOutControlNone = 0; { No Drop-out control }
TTDropOutControlSimple = 1; { Simple Drop-out control ( rule #3 ) }
TTDropOutControlComplex = 2; { Sophisticated control ( rule #4 ) }
type
(* Cette structure permet de décrire le type du BitMap où seront *)
(* rendus les glyphes *)
PRasterBlock = ^TRasterBlock;
TRasterBlock = record
Rows : ULong; (* Nombre de lignes du bloc *)
Cols : ULong; (* Nombre de colonnes du bloc *)
Width : ULong; (* Nombre de pixels/ligne *)
Flow : LongInt; (* Définit l'orientation du *)
(* bitmap *)
Buffer : Pointer; (* Pointeur vers le Buffer *)
Size : ULong; (* Taille du buffer *)
end;
(* Cette structure permet de décrire au rasterizer le glyphe que nous *)
(* voulons rendre dans le BitMap *)
PGlyphRecord = ^TGlyphRecord;
TGlyphRecord = record
Outlines : ULong; (* Nombre de contours du glyphe *)
OutStarts : Pointer; (* Indices de début de chaque *)
(* contour *)
Points : ULong; (* Nombre de points *)
XCoord : Pointer; (* Tableau des abscisses *)
YCoord : Pointer; (* Tableau des ordonnées *)
Flag : Pointer; (* Tableau des flags *)
end;
var
Rast_Err : Int;
function InitRasterizer( var rasterBlock : TRasterBlock;
profBuffer : PStorage;
profSize : ULong
)
: Int;
function RenderGlyph( var AGlyph : TGlyphRecord;
xmax,
ymax : Int
) : boolean;
implementation
const
MaxBezier = 32; (* Le nombre maximum de sous-arcs de Bezier *)
MaxProfils = 256; (* Le nombre maximum de profils d'un glyphe *)
Precision = 64; (* Precision sur 6 bits *)
Precision2 = Precision div 2; (* La moitié de notre précision *)
type
TEtats = ( Indetermine, Ascendant, Descendant, Plat, Rupture );
PTraceRec = ^TTraceRec;
PProfil = ^TProfil;
TProfil = record
Flow : Int; (* Profil montant ou descendant *)
Height : Int; (* Hauteur du profil *)
Start : Int; (* ordonnée de départ du profil *)
Offset : ULong; (* Offset de début du profil *)
Link : PProfil; (* Prochain profil de la liste *)
Index : Int; (* Index dans le teableau de *)
(* tracé *)
CountL : Int; (* Nombre de lignes à compléter *)
(* avant le début du tracé de *)
(* ce profil *)
StartL : Int; (* Première ligne du tracé *)
Trace : PTraceRec; (* Pointeur sur le tracé utilisé *)
end;
TBand = record
Y_Min : Int;
Y_Max : Int;
end;
TTraceElement = record
Profil : PProfil; (* Profil de cette abscisse *)
X : LongInt; (* Abscisse sur la ligne courante *)
end;
PTraceArray = ^TTraceArray;
TTraceArray = Array[0..127] of TTraceElement;
TTraceRec = record
N : Int;
T : PTraceArray;
end;
const
AlignProfileSize = ( sizeOf(TProfil) + 3 ) div 4;
AlignTraceSize = ( sizeOf(TTraceRec) + 3 ) div 4;
var
cProfil : PProfil; (* Profil Courant *)
fProfil : PProfil; (* Tête de la liste chaînée des profils *)
oProfil : PProfil; (* Old Profile *)
gProfil : PProfil; (* Last Profile in case of impact *)
nProfs : Int; (* Nombre courant de profils *)
Etat : TEtats; (* Etat du trace *)
Fresh : Boolean; (* Indique un profil neuf dont le champ 'START' *)
(* doit être complété *)
Joint : Boolean; (* Indique que le dernier arc est tombé pile
sur une scanLine. Evite les doublons *)
Buff : PStorage; (* Buffer Profils *)
MaxBuff : ULong; (* Taille du buffer *)
profCur : ULong; (* Curseur du Buffer Profils *)
Cible : TRasterBlock; (* Description du Bitmap cible *)
BCible : PByteArray; (* Buffer bitmap cible *)
Band_Stack : array[1..16] of TBand;
Band_Top : Int;
Trace_Left,
Trace_Right : TTraceRec;
TraceOfs : Int; (* Offset courant du tracé dans le bitmap *)
DebugOfs : Int; (* Offset écrant pour le débogage du tracé *)
Arcs : Array[0..2*MaxBezier] of
record (* La pile de points qui permet *)
X, Y : LongInt (* de travailler sur les arcs de *)
end; (* Bézier *)
CurArc : Int; (* Taille de la pile *)
XCoord,
YCoord : PStorage;
Flags : PByteArray;
Outs : PShortArray;
nPoints,
nContours : Int;
LastX,
La